home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / netop.inc < prev    next >
Text File  |  2005-03-31  |  14KB  |  487 lines

  1. #
  2. # This NASL script has been produced as a collaboration between:
  3. #
  4. # - Martin O'Neal of Corsaire (http://www.corsaire.com)  
  5. # - Jakob Bohm of Danware (http://www.danware.dk)
  6. # The original script produced by Martin O'Neal has been heavily modified 
  7. # by Jakob Bohm to provide additional product detail, plus also to limit 
  8. # any unnecessary information leakage caused by the scanning process itself. 
  9. # Jakob has also rewritten the test set as a whole to use the minimum of 
  10. # network traffic and make the process as efficient as possible. All together 
  11. # a jolly good show.
  12. # DISCLAIMER
  13. # The information contained within this script is supplied "as-is" with 
  14. # no warranties or guarantees of fitness of use or otherwise. Neither Corsaire 
  15. # or Danware accept any responsibility for any damage caused by the use or misuse 
  16. # of this information.
  17. #  
  18.  
  19. include("misc_func.inc");
  20.  
  21. ############## Meta-information recorded in the name of the KB entry ################
  22.  
  23. local_var port;
  24. local_var addr;
  25. local_var proto_nam;
  26.  
  27.  
  28. ############## HELO packets in NetOps native format ################
  29.  
  30. local_var helo_pkt_udp;
  31. local_var helo_pkt_gen;
  32. local_var quit_pkt_stream;
  33.  
  34. ############## Received reply in NetOps native format ##################
  35.  
  36. local_var banner_pkt; 
  37.  
  38. ############## General derived strings ##################
  39.  
  40. local_var netop_kb_key;
  41. local_var netop_kb_val;
  42.  
  43. local_var netop_svcidstr;
  44. local_var netop_prod_typ;
  45. local_var netop_prod_nam;
  46. local_var netop_prod_dsc;
  47.  
  48. ################### HELO packet for UDP only ##################
  49.  
  50. helo_pkt_udp=
  51.     hex2raw(
  52.         s:'d6818106010000f70e5301044e657373'+
  53.           '757301436f7273616972ff0100008701') + # 0-31
  54.     crap(length:32 , data: raw_string(0x20))      + # 32-63
  55.     crap(length:224, data: raw_string(0x00));       # 64-288
  56.  
  57. ################### Generic HELO packet ##################
  58.  
  59. helo_pkt_gen=
  60.     hex2raw(
  61.         s:'d6818106010000f73e4e010400000000'+
  62.           '000001436f7273616972ff0100008701') + # 0-31
  63.     crap(length:32 , data: raw_string(0x20))      + # 32-63
  64.     crap(length:224, data: raw_string(0x00));       # 64-288
  65.             
  66. ################### QUIT packet for stream transports (tcp etc.)  ##################
  67.  
  68. quit_pkt_stream=
  69.     hex2raw(
  70.         s:'d681810000f900f9eee3')             + # 0-9
  71.     crap(length:16, data: raw_string(0x00));        # 10-25
  72.             
  73.  
  74. ################### utility functions ##################
  75.  
  76. function netop_zeropad(str, len)
  77. {
  78.     local_var res;
  79.     res = crap(length: len, data: raw_string(0));
  80.     if (!isnull(str))
  81.     {
  82.         res = substr(str + res, 0, len - 1);
  83.     }
  84.     return res;
  85. }
  86.  
  87. function netop_spacepad(str, len)
  88. {
  89.     local_var res;
  90.     res = crap(length: len, data: ' ');
  91.     if (!isnull(str))
  92.     {
  93.         res = substr(str + res, 0, len - 1);
  94.     }
  95.     return res;
  96. }
  97.  
  98. function ip_dot2raw(ip_dot)
  99. {
  100.     # initialise variables
  101.     local_var int32;
  102.     local_var octet;
  103.     ip_dot=split(ip_dot,sep:".",keep:0);
  104.     int32 = '';
  105.  
  106.     # step through octets
  107.     for(octet=0;octet<4;octet++)
  108.     {
  109.         int32=raw_string(int(ip_dot[octet]),int32);
  110.     }
  111.     
  112.     return(int32);
  113. }
  114.  
  115.  
  116.  
  117. # declare function
  118. function ip_raw2dot(int32)
  119. {
  120.     # initialise variables
  121.     local_var ip_dot;
  122.  
  123.     ip_dot=int(ord(int32[3]))+"."+int(ord(int32[2]))+"."+int(ord(int32[1]))+"."+int(ord(int32[0]));
  124.     
  125.     return(ip_dot);
  126. }
  127.  
  128.  
  129. ################### extract info items from banner ###################
  130.  
  131. function netop_banner_items(typ)
  132. {
  133.     local_var res;
  134.     local_var i;
  135.     local_var v1;
  136.     res = '';
  137.     for (i = 64; i < 320; i += 32)
  138.     {
  139.         v1 = substr(netop_kb_val, i, i + 31);
  140.         if (typ == 0 && ord(v1) >= 32 ||
  141.             typ != 0 && typ == ord(v1))
  142.         {
  143.             if (typ > 2)
  144.                 v1 = substr(v1, 1, 31);
  145.             if (typ == 2)
  146.                 v1 = ip_raw2dot(int32: substr(v1, 1, 4));
  147.             if (typ == 1)
  148.                 v1 = hexstr(substr(v1, 1, 6));
  149.             if (res != '')
  150.                 res += ', ';
  151.             res += '"' + chomp(v1) + '"';
  152.         }
  153.     }
  154.     return res;
  155. }
  156.  
  157. ################### derive product type from banner etc. ###################
  158.  
  159. function netop_product_ident()
  160. {
  161.     local_var school_phrase1;
  162.     local_var school_stud_dsc;
  163.     local_var rc_also_host;
  164.     local_var rc_host_dsc;
  165.     
  166.     school_phrase1 = 
  167.         'During the session, the Teacher' +
  168.         ' has extensive control over the users computer,' +
  169.         ' with very few restrictions, as is appropriate' +
  170.         ' when the teacher can be assumed to be a higher' +
  171.         ' authority than the student.';
  172.     
  173.     school_stud_dsc =
  174.         'NetOp School Student (client) allows its user to' +
  175.         ' participate in live online education or training' +
  176.         ' sessions broadcast from a computer running NetOp' +
  177.         ' School Teacher.\n\n' +
  178.         school_phrase1;
  179.     
  180.     rc_also_host =
  181.         ' is also a fully' +
  182.         ' featured NetOp Remote Control Host, which allows' +
  183.         ' its computer to be remotely controlled and/or' +
  184.         ' managed from any NetOp Remote Control Guest' +
  185.         ' subject to a seperate set of configurable' +
  186.         ' security restrictions.';
  187.     
  188.     rc_host_dsc =
  189.         'NetOp Remote Control Host is a service / agent,' +
  190.         ' which allows the computer on which it is running' +
  191.         ' to be remotely controlled and/or managed from any' +
  192.         ' NetOp Remote Control Guest program, subject to a' +
  193.         ' wide selection of configurable security and' +
  194.         ' authentication restrictions.';
  195.     
  196.     
  197.     if (     (ord(netop_kb_val[63]) & 0x08) != 0  ||
  198.              netop_banner_items(typ:17)     != '' )
  199.     {
  200.         netop_svcidstr = 'netop-sch';
  201.         netop_prod_typ = 'SSTD';
  202.         netop_prod_nam = 'NetOp School Student';
  203.         netop_prod_dsc = school_stud_dsc;
  204.     }
  205.     else if ((ord(netop_kb_val[63]) & 0x10) != 0  ||
  206.              netop_banner_items(typ:8)      != '' )
  207.     {
  208.         netop_svcidstr = 'netop-teacher';
  209.         netop_prod_typ = 'STCH';
  210.         netop_prod_nam = 'NetOp School Teacher';
  211.         netop_prod_dsc =
  212.             'NetOp School Teacher (console) allows its user to' +
  213.             ' conduct live online education or training' +
  214.             ' sessions broadcast to computers running NetOp' +
  215.             ' School Student.\n\n' +
  216.             school_phrase1;
  217.     }
  218.     else if ((ord(netop_kb_val[63]) & 0x04) != 0  ||
  219.              netop_banner_items(typ:6)      != '' ||
  220.              netop_banner_items(typ:7)      != '' )
  221.     {
  222.         netop_svcidstr = 'netop-guest';
  223.         netop_prod_typ = 'RGST';
  224.         netop_prod_nam = 'NetOp Remote Control Guest';
  225.         netop_prod_dsc =
  226.             'NetOp Remote Control Guest (client) allows its' +
  227.             ' user to remotely control and/or manage any' +
  228.             ' computer running NetOp Remote Control Host' +
  229.             ' modules on a variety of operating systems,' +
  230.             ' subject of cause to the security restrictions' +
  231.             ' configured on that Host.';
  232.     }
  233.     else if ((ord(netop_kb_val[62]) & 0x01) != 0)
  234.     {
  235.         netop_svcidstr = 'netop-rc';
  236.         netop_prod_typ = 'RGWS';
  237.         netop_prod_nam = 'NetOp Remote Control Gateway';
  238.         netop_prod_dsc =
  239.             'NetOp Remote Control Gateway is an application' +
  240.             ' layer proxy allowing programs from the NetOp' +
  241.             ' Remote Control and NetOp School families to' +
  242.             ' communicate across proxy-style firewalls,' +
  243.             ' disjoint networks, dissimilar network protocols' +
  244.             ' (e.g. modems, shared memory, TCP and UDP) etc.' +
  245.             ' subject to configurable access restrictions.' +
  246.             '\n\n' +
  247.             netop_prod_nam + rc_also_host;
  248.     }
  249.     else if ((ord(netop_kb_val[62]) & 0x08) != 0)
  250.     {
  251.         netop_svcidstr = 'netop-rc';
  252.         netop_prod_typ = 'RNMS';
  253.         netop_prod_nam = 'NetOp Remote Control Name Server';
  254.         netop_prod_dsc =
  255.             'NetOp Name Server is a dynamic' +
  256.             ' naming service allowing programs from the NetOp' +
  257.             ' Remote Control and NetOp School families to' +
  258.             ' locate each other even when general facilities' +
  259.             ' such as dynamic DNS are not available to all' +
  260.             ' participating computers, or when ports etc. need' +
  261.             ' to be included in the naming information' +
  262.             ' published.\n\n' +
  263.             netop_prod_nam + rc_also_host;
  264.     }
  265.     else if (netop_banner_items(typ:5)      != '' ||
  266.          netop_banner_items(typ:14)     != '' )
  267.     {
  268.         netop_svcidstr = 'netop-rc';
  269.         netop_prod_typ = 'RSES';
  270.         netop_prod_nam = 'NetOp Remote Control Security Server';
  271.         netop_prod_dsc =
  272.             'NetOp Remote Control Security Server is a central' +
  273.             ' authentication and authorization server allowing' +
  274.             ' centralized login validation, permission' +
  275.             ' management and security event logging for' +
  276.             ' programs from the NetOp Remote Control family.' +
  277.             '\n\n' +
  278.             netop_prod_nam + rc_also_host;
  279.     }
  280.     else if ((ord(netop_kb_val[63]) & 0x02) != 0)
  281.     {
  282.         netop_svcidstr = 'netop-rc';
  283.         netop_prod_typ = 'RHST';
  284.         netop_prod_nam = 'NetOp Remote Control Host';
  285.         netop_prod_dsc = rc_host_dsc;
  286.     }
  287.     else if (port == 1971)
  288.     {
  289.         netop_svcidstr = 'netop-sch';
  290.         netop_prod_typ = 'SCH?';
  291.         netop_prod_nam = 'NetOp School Student or Teacher';
  292.         netop_prod_dsc = school_stud_dsc;
  293.     }
  294.     else
  295.     {
  296.         netop_svcidstr = 'netop-rc';
  297.         netop_prod_typ = 'NRC?';
  298.         netop_prod_nam = 'NetOp Remote Control Host or Guest';
  299.         netop_prod_dsc = rc_host_dsc;
  300.     }
  301.     
  302.     netop_prod_dsc += '\n\nSee http://www.netop.com for more info.\n';
  303.  
  304. }
  305.  
  306.  
  307. ################ Log that a NetOp program has been detected ################
  308.  
  309. function netop_log_detected()
  310. {
  311.     local_var msg;
  312.     local_var info_only;
  313.  
  314.     info_only = 0;
  315.  
  316.     msg = '\nDanware ' + netop_prod_nam +
  317.         ' is listening on this port\n\n' +
  318.         netop_prod_dsc +
  319.         '\nSolution:  ';
  320.  
  321.     if (netop_prod_typ == 'RGST')
  322.     {
  323.         info_only = 1;
  324.         msg += 'Make sure the user of this machine is' +
  325.             ' authorized to remotely manage other computers' +
  326.             ' or has been permitted to use this computer as' +
  327.             ' a terminal to access other computers.\n\n' +
  328.             'Risk factor: Low\n';
  329.     }
  330.     else if (netop_prod_typ == 'STCH')
  331.     {
  332.         info_only = 1;
  333.         msg += 'Make sure the user of this machine is a teacher' +
  334.             ' or is acting as a group leader for some' +
  335.             ' teamwork\n\n' +
  336.             'Risk factor: Low\n';
  337.     }
  338.     else if (netop_prod_typ == 'SSTD' || netop_prod_typ == 'SCH?')
  339.     {
  340.         info_only = 1;
  341.         msg += 'Make sure the user of this machine is currently' +
  342.             ' participating in online training using NetOp' +
  343.             ' School, and that a teacher password has been' +
  344.             ' set on the Student.\n\n' +
  345.             'Outside dedicated teaching environments, NetOp' +
  346.             ' School should not be running when the user is' +
  347.             ' not actively participating in a class\n\n' +
  348.             'Risk factor: Medium\n';
  349.     }
  350.     else if (netop_prod_typ == 'RHST' || netop_prod_typ == 'NRC?')
  351.     {
  352.         msg += 'If this program is required, make sure' +
  353.             ' appropriate security settings are used (on the' +
  354.             ' Options menu), including strong passwords on' +
  355.             ' permitted accounts and an effective action on' +
  356.             ' too many bad password attempts\n\n' +
  357.             'If this program is unused, disable load at' +
  358.             ' system startup from the programs option menu or' +
  359.             ' uninstall the software.\n\n' +
  360.             'Risk factor: Low\n';
  361.     }
  362.     else
  363.     {
  364.         msg += 'If this service is running deliberately, make' +
  365.             ' sure it is configured with strong security' +
  366.             ' settings on the options menu, including strong' +
  367.             ' passwords on any enabled accounts and an' +
  368.             ' effective action on too many failed logins\n\n' +
  369.             'If this service is not supposed to be running,' +
  370.             ' uninstall it and investigate why and how it was' +
  371.             ' installed.\n\n' +
  372.             'Risk factor: Medium\n';
  373.     }
  374.     
  375.     security_warning(proto:proto_nam, port:port, data:msg);
  376.     
  377. }
  378.  
  379. ################ Extract information from KB value and key ################
  380.  
  381. function netop_kb_derive()
  382. {
  383.     netop_kb_val = netop_zeropad(str: netop_kb_val, len: 320);
  384.     if (ord(netop_kb_val[0]) >  32 )
  385.     {
  386.         netop_kb_key = substr(netop_kb_val, 0, 31);
  387.     }
  388.     netop_kb_key = netop_zeropad(str: netop_kb_key, len: 32);
  389.     insstr(netop_kb_val, netop_kb_key, 0, 31);
  390.  
  391.     proto_nam = chomp(substr(netop_kb_key, 0, 7));
  392.     port      = ord(netop_kb_key[9]) * 256 + ord(netop_kb_key[8]);
  393.     addr      = ip_raw2dot(int32: substr(netop_kb_key, 16, 31));
  394.     
  395.     netop_product_ident();
  396. }
  397.  
  398. ########### Check if any NetOp programs found and fork for each ###########
  399.  
  400. function netop_each_found()
  401. {
  402.     netop_kb_val = get_kb_item('NetOp/allbanners');
  403.     if (isnull(netop_kb_val))
  404.     {
  405.         return 0;
  406.     }
  407.     else
  408.     {
  409.         netop_kb_val = hex2raw(s:netop_kb_val);
  410.         netop_kb_derive();
  411.         return 1;
  412.     }
  413. }
  414.  
  415. ######### validate banner to see if it is from NetOp, then add to KB ########
  416.  
  417. function netop_check_and_add_banner()
  418. {
  419.     local_var blen;
  420.     local_var s1;
  421.     local_var s2;
  422.  
  423.     netop_kb_key = netop_spacepad(str: proto_nam, len: 8)
  424.                  + netop_zeropad( str:
  425.                       raw_string((port & 255), ((port & 65280) >> 8)),
  426.                       len: 8)
  427.                  + netop_zeropad( str: ip_dot2raw(ip_dot:addr), len: 16);
  428.  
  429.     # check response contains correct contents
  430.     if (isnull(banner_pkt))
  431.     {
  432.         banner_pkt = '';
  433.     }
  434.  
  435.     blen = strlen(banner_pkt);
  436.     if(blen > 23                    && 
  437.        ord(banner_pkt[0])==0xd6     && 
  438.        banner_pkt[1]==banner_pkt[2] &&
  439.        ((ord(banner_pkt[7])==0xf8 &&
  440.          blen >= 32 &&
  441.          substr(banner_pkt, 11, 17) == 'Corsair') ||
  442.         (ord(banner_pkt[7])==0xf9 && ord(banner_pkt[5])==0xf9)))
  443.     {
  444.         if (ord(banner_pkt[7])==0xf9 && blen > 27)
  445.         {
  446.             banner_pkt = substr(banner_pkt, 0, 26);
  447.         }
  448.         
  449.         
  450.         # Force packet size before adding to knowledge base
  451.         netop_kb_val =
  452.            netop_zeropad(str: (netop_kb_key + banner_pkt), len: 320);
  453.  
  454.         netop_kb_derive();
  455.  
  456.         # update knowledge base
  457.         s2 = 'NetOp/' + hexstr(netop_kb_key) + '/banner';
  458.         set_kb_item(name:s2, value:hexstr(netop_kb_val));
  459.         set_kb_item(
  460.             name:'NetOp/allbanners',
  461.             value:hexstr(netop_kb_val));
  462.         
  463.         s1 = proto_nam + '/';
  464.         if (s1 == 'tcp/') s1 ='';
  465.         
  466.         s2 = 'Known/' + proto_nam + '/' + port;
  467.         set_kb_item(name:s2, value:netop_svcidstr);
  468.         s2 = 'Services/' + s1 + netop_svcidstr;
  469.         set_kb_item(name:s2, value:port);
  470.         s2 = 'Services/' + s1 + 'netop-any';
  471.         set_kb_item(name:s2, value:port);
  472.  
  473.         netop_log_detected();
  474.     }
  475.     else
  476.     {
  477.         netop_kb_val = crap(length: 320, data: raw_string(0x00));
  478.     }
  479. }
  480.  
  481.  
  482.  
  483. ################### end of netop.inc ##################
  484.  
  485.